// 启动初始化

module.exports = app => {

    // app.locals 为全局的，一般在 app.js 里面配置全局变量。ctx.locals 为单次请求的，会合并 app.locals。


    // 接收agent.js 发送来的数据
    app.messenger.on('init_action', data => {
        // ...
        console.log(data);
    });

    // 注意，只有在 egg-ready 事件拿到之后才能发送消息
    app.messenger.once('egg-ready', () => {
        app.messenger.sendToAgent('agent-event', { foo: 'come from app ,send to agent~' });
        app.messenger.sendToApp('app-event', { foo: 'come from app ,send to app~' });
    });

    // 接收 app-event 事件的数据
    app.messenger.on('app-event', data => {
        // ...
        console.log('come from app: ', data);
    });


    app.beforeStart(async() => {

        // 除了在请求时可以获取 Context 实例之外， 在有些非用户请求的场景下我们需要访问 service / model 等 Context 实例上的对象，
        // 我们可以通过 Application.createAnonymousContext() 方法创建一个匿名 Context 实例：
        // const ctx = app.createAnonymousContext();
        // preload before app start
        // let car = await ctx.service.car.findCar();
        // console.log(car)


        // 示例：启动的时候去读取 https://registry.npm.taobao.org/egg/latest 的版本信息
        // const result = await app.curl('https://registry.npm.taobao.org/egg/latest', {
        //     dataType: 'json',
        // });
        // app.logger.info('Egg latest version: %s', result.data.version);
        console.log('========== beforeStart ========= ');

        // const result = await app.curl('http://www.tianqiapi.com/api?version=v9&appid=23035354&appsecret=8YvlPNrz', { dataType: 'json' })
        // console.log(result)


        // 启动时，手动触发一下定时器
        // await app.runSchedule('update_cache');

    });

    // server事件一个 worker 进程只会触发一次，在 HTTP 服务完成启动后，会将 HTTP server 通过这个事件暴露出来给开发者。
    app.once('server', function(server) {
        // server事件一个 worker 进程只会触发一次
        console.log('========== server init,只会触发一次 ========= ');
    });

    // 运行时有任何的异常被 onerror 插件捕获后，都会触发 error 事件，将错误对象和关联的上下文（如果有）暴露给开发者，可以进行自定义的日志记录上报等处理。
    app.on('error', (err, ctx) => {
        // report error
    });


    // request 和 response: 应用收到请求和响应请求时，分别会触发 request 和 response 事件，并将当前请求上下文暴露出来，开发者可以监听这两个事件来进行日志记录。
    app.on('request', ctx => {
        // log receive request
        const data = ctx.query;
        console.log('======= request ======' + JSON.stringify(data));
    });

    app.on('response', ctx => {
        console.log('emit response..');
        // ctx.starttime is set by framework
        // const used = Date.now() - ctx.starttime;
        // log total cost
        // console.log(used)

    });


};